home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / hireswall.s < prev    next >
Text File  |  1997-01-31  |  37KB  |  2,622 lines

  1. leftclip: dc.w 0
  2. rightclip: dc.w 0
  3. deftopclip: dc.w 0
  4. defbotclip: dc.w 0
  5. leftclipandlast: dc.w 0
  6.  
  7. SCALE MACRO
  8.  dc.w 64*0
  9.  dc.w 64*1
  10.  dc.w 64*1
  11.  dc.w 64*2
  12.  dc.w 64*2
  13.  dc.w 64*3
  14.  dc.w 64*3
  15.  dc.w 64*4
  16.  dc.w 64*4
  17.  dc.w 64*5
  18.  dc.w 64*5
  19.  dc.w 64*6
  20.  dc.w 64*6
  21.  dc.w 64*7
  22.  dc.w 64*7
  23.  dc.w 64*8
  24.  dc.w 64*8
  25.  dc.w 64*9
  26.  dc.w 64*9
  27.  dc.w 64*10
  28.  dc.w 64*10
  29.  dc.w 64*11
  30.  dc.w 64*11
  31.  dc.w 64*12
  32.  dc.w 64*12
  33.  dc.w 64*13
  34.  dc.w 64*13
  35.  dc.w 64*14
  36.  dc.w 64*14
  37.  dc.w 64*15
  38.  dc.w 64*15
  39.  dc.w 64*16
  40.  dc.w 64*16
  41.  dc.w 64*17
  42.  dc.w 64*17
  43.  dc.w 64*18
  44.  dc.w 64*18
  45.  dc.w 64*19
  46.  dc.w 64*19
  47.  dc.w 64*20
  48.  dc.w 64*20
  49.  dc.w 64*21
  50.  dc.w 64*21
  51.  dc.w 64*22
  52.  dc.w 64*22
  53.  dc.w 64*23
  54.  dc.w 64*23
  55.  dc.w 64*24
  56.  dc.w 64*24
  57.  dc.w 64*25
  58.  dc.w 64*25
  59.  dc.w 64*26
  60.  dc.w 64*26
  61.  dc.w 64*27
  62.  dc.w 64*27
  63.  dc.w 64*28
  64.  dc.w 64*28
  65.  dc.w 64*29
  66.  dc.w 64*29
  67.  dc.w 64*30
  68.  dc.w 64*30
  69.  dc.w 64*31
  70.  dc.w 64*31
  71.  dc.w 64*31
  72.  dc.w 64*31
  73.  dc.w 64*31
  74.  dc.w 64*31
  75.  dc.w 64*31
  76.  dc.w 64*31
  77.  dc.w 64*31
  78.  dc.w 64*31
  79.  dc.w 64*31
  80.  dc.w 64*31
  81.  dc.w 64*31
  82.  dc.w 64*31
  83.  dc.w 64*31
  84.  dc.w 64*31
  85.  dc.w 64*31
  86.  dc.w 64*31
  87.  dc.w 64*31
  88.  dc.w 64*31
  89.  ENDM
  90.  
  91. *********************************** 
  92.  
  93. * The screendivide routine is simpler
  94. * using a0=left pixel
  95. * a2= right pixel
  96. * d0= left dist
  97. * d2= right dist
  98. * d4 = left strip
  99. * d5 = right strip
  100.  
  101. * (a0)=leftx
  102. * 2(a0)=rightx
  103.  
  104. * 4(a0)=leftbm
  105. * 6(a0)=rightbm
  106.  
  107. * 8(a0)=leftdist
  108. * 10(a0)=rightdist
  109.  
  110. * 12(a0)=lefttop
  111. * 14(a0)=righttop
  112.  
  113. * 16(a0)=leftbot
  114. * 18(a0)=rightbot
  115.  
  116.  
  117. Doleftend:
  118.  
  119.  move.w leftclip,d0
  120.  sub.w #1,d0
  121.  move.w d0,leftclipandlast
  122.  
  123.  
  124.  move.w (a0),d0
  125.  move.w 2(a0),d1
  126.  sub.w d0,d1
  127.  bge.s sometodraw
  128.  rts
  129. sometodraw:
  130.  move.w itertab(pc,d1.w*4),d7
  131.  swap d0
  132.  move.w itertab+2(pc,d1.w*4),d6
  133.  clr.w d0
  134.  swap d1
  135.  clr.w d1
  136.  asr.l d6,d1
  137.  move.l d1,(a0)
  138.  
  139.  bra pstit
  140.  
  141. itertab:
  142.  incbin "ab3:includes/iterfile"
  143.  
  144. pstit:
  145.  
  146.  moveq #0,d1
  147.  move.w 4(a0),d1
  148.  moveq #0,d2
  149.  move.w 6(a0),d2
  150.  sub.w d1,d2
  151.  swap d1
  152.  swap d2
  153.  asr.l d6,d2
  154.  move.l d2,4(a0)
  155.  
  156.  moveq #0,d2
  157.  move.w 8(a0),d2
  158.  moveq #0,d3
  159.  move.w 10(a0),d3
  160.  sub.w d2,d3
  161.  swap d2
  162.  swap d3
  163.  asr.l d6,d3
  164.  move.l d3,8(a0)
  165.  
  166.  moveq #0,d3
  167.  move.w 12(a0),d3
  168.  moveq #0,d4
  169.  move.w 14(a0),d4
  170.  sub.w d3,d4
  171.  swap d3
  172.  swap d4
  173.  asr.l d6,d4
  174.  move.l d4,12(a0)
  175.  
  176.  moveq #0,d4
  177.  move.w 16(a0),d4
  178.  moveq #0,d5
  179.  move.w 18(a0),d5
  180.  sub.w d4,d5
  181.  swap d4
  182.  swap d5
  183.  asr.l d6,d5
  184.  move.l d5,16(a0)
  185.  
  186.  
  187. *** Gouraud shading ***
  188.  moveq #0,d5
  189.  move.w 26(a0),d5
  190.  sub.w 24(a0),d5
  191.  add.w d5,d5
  192.  swap d5
  193.  asr.l d6,d5
  194.  move.l d5,28(a0)
  195.  moveq #0,d5
  196.  move.w 24(a0),d5
  197.  add.w d5,d5
  198.  swap d5
  199.  
  200.  bra screendivide
  201.  
  202. itercount: dc.w 0
  203.  
  204. screendividethru:
  205.  
  206. .scrdrawlop:
  207.  
  208.  move.w (a0)+,d0
  209. ; move.l FASTBUFFER,a3
  210.  move.l frompt,a3
  211.  adda.w .scrintocop(pc,d0.w*2),a3
  212.  move.l (a0)+,d1
  213.  
  214.  bra .pastscrinto
  215.  
  216. .scrintocop:
  217.  incbin "ab3:includes/XTOCOPX"
  218.  
  219. .pastscrinto: 
  220.  
  221.  swap d1
  222.  
  223.  move.w d1,d6
  224.  and.w HORAND,d6
  225.  move.l (a0)+,d2
  226.  swap d2
  227.  add.w fromtile(pc),d6
  228.  add.w d6,d6
  229.  move.w d6,a5
  230.  move.l (a0)+,d3
  231.  swap d3
  232.  add.l #divthreetab,a5
  233.  move.w (a5),StripData
  234.  
  235.  move.l ChunkAddr,a5
  236.  moveq #0,d6
  237.  move.b StripData,d6
  238.  add.w d6,d6
  239.  move.w VALSHIFT,d4
  240.  asl.l d4,d6
  241.  add.l d6,a5
  242.  move.l (a0)+,d4
  243.  swap d4
  244.  move.w d2,d6
  245. ***************************
  246. * old version
  247.  asr.w #7,d6
  248. ***************************
  249. ; asr.w #3,d6
  250. ; sub.w #4,d6
  251. ; cmp.w #6,d6
  252. ; blt.s tstbrbr
  253. ; move.w #6,d6
  254. ;tstbrbr:
  255. ***************************
  256.  add.w angbright(pc),d6
  257.  bge.s .brnotneg
  258.  moveq #0,d6
  259. .brnotneg
  260.  cmp.w #32,d6
  261.  blt.s .brnotpos
  262.  move.w #32,d6
  263. .brnotpos
  264.  move.l PaletteAddr,a2
  265.  move.l a2,a4
  266.  add.w .ffscrpickhowbright(pc,d6*2),a2
  267. ; and.b #$fe,d6
  268. ; add.w .ffscrpickhowbright(pc,d6*2),a4
  269.  
  270. ; btst #0,d0
  271. ; beq .nobrightswap
  272. ; exg a2,a4
  273. ;.nobrightswap:
  274.  
  275.  move.w d7,-(a7)
  276.  bsr ScreenWallstripdrawthru
  277.  move.w (a7)+,d7
  278.  
  279.  dbra d7,.scrdrawlop
  280.  rts
  281.  
  282. .ffscrpickhowbright:
  283.  SCALE
  284.  
  285.  
  286. ***************************
  287.  
  288. screendivide:
  289.  
  290.  or.l #$ffff0000,d7
  291.  move.w leftclipandlast(pc),d6
  292.  move.l #WorkSpace,a2
  293.  
  294.  move.l (a0),a3
  295.  move.l 4(a0),a4
  296.  move.l 8(a0),a5
  297.  move.l 12(a0),a6
  298.  move.l 16(a0),a1
  299.  move.l 28(a0),a0
  300.  
  301. scrdivlop:
  302.  
  303.  swap d0
  304.  cmp.w d6,d0
  305.  bgt scrnotoffleft
  306.  swap d0
  307.  add.l a4,d1
  308.  add.l a5,d2
  309.  add.l a6,d3
  310.  add.l a1,d4
  311.  add.l a3,d0
  312.  add.l a0,d5
  313.  dbra d7,scrdivlop
  314.  rts
  315.  
  316. scrnotoffleft:
  317.  
  318.  move.w d0,d6
  319.  
  320.  cmp.w rightclip(pc),d0
  321.  bge.s outofcalc
  322.  
  323. scrnotoffright:
  324.  
  325.  
  326.  move.w d0,(a2)+
  327.  move.l d1,(a2)+
  328.  move.l d2,(a2)+
  329.  move.l d3,(a2)+
  330.  move.l d4,(a2)+
  331.  move.l d5,(a2)+
  332.  swap d0
  333.  add.l a3,d0
  334.  add.l a4,d1
  335.  add.l a5,d2
  336.  add.l a6,d3
  337.  add.l a1,d4
  338.  add.l a0,d5
  339.  add.l #$10000,d7
  340.  dbra d7,scrdivlop
  341.  
  342. outofcalc:
  343.  swap d7
  344.  tst.w d7
  345.  bge.s .somethingtodraw
  346.  rts
  347. .somethingtodraw:
  348.  
  349.  move.l #consttab,a1
  350.  move.l #WorkSpace,a0
  351.  
  352.  tst.b FULLSCR
  353.  bne screendivideFULL
  354.  
  355. ; tst.b seethru
  356. ; bne screendividethru
  357.  
  358.  tst.b DOUBLEWIDTH
  359.  bne scrdrawlopDOUB
  360.  
  361. scrdrawlop:
  362.  
  363.  move.w (a0)+,d0
  364. ; move.l FASTBUFFER,a3
  365.  move.l frompt,a3
  366.  adda.w .scrintocop(pc,d0.w*2),a3
  367. ; lea (a3,d0.w),a3
  368.  move.l (a0)+,d1
  369.  
  370.  bra .pastscrinto
  371. .scrintocop:
  372.  incbin "XTOCOPX"
  373.  
  374. .pastscrinto
  375.  
  376.  swap d1
  377.  
  378.  move.w d1,d6
  379.  and.w HORAND,d6
  380.  move.l (a0)+,d2
  381.  swap d2
  382.  add.w fromtile(pc),d6
  383.  add.w d6,d6
  384.  move.w d6,a5
  385.  move.l (a0)+,d3
  386.  swap d3
  387.  add.l #divthreetab,a5
  388.  move.w (a5),StripData
  389.  
  390.  move.l ChunkAddr,a5
  391.  moveq #0,d6
  392.  move.b StripData,d6
  393.  add.w d6,d6
  394.  move.w VALSHIFT,d4
  395.  asl.l d4,d6
  396.  add.l d6,a5
  397.  move.l (a0)+,d4
  398.  swap d4
  399.  addq #1,d4
  400.  move.w d2,d6
  401. ***************************
  402. * old version
  403.  asr.w #7,d6
  404. ***************************
  405. ; asr.w #3,d6
  406. ; sub.w #4,d6
  407. ; cmp.w #6,d6
  408. ; blt.s tstbrbr
  409. ; move.w #6,d6
  410. ;tstbrbr:
  411. ***************************
  412.  move.l (a0)+,d5
  413.  swap d5
  414.  ext.w d5
  415.  add.w d5,d6
  416.  bge.s .brnotneg
  417.  moveq #0,d6
  418. .brnotneg
  419.  cmp.w #64,d6
  420.  blt.s .brnotpos
  421.  move.w #64,d6
  422. .brnotpos
  423.  move.l PaletteAddr,a2
  424.  move.l a2,a4
  425.  add.w ffscrpickhowbright(pc,d6*2),a2
  426.  and.b #$fe,d6
  427.  add.w ffscrpickhowbright(pc,d6*2),a4
  428.  
  429.  btst #0,d0
  430.  beq .nobrightswap
  431.  exg a2,a4
  432. .nobrightswap:
  433.  
  434.  move.w d7,-(a7)
  435.  bsr ScreenWallstripdraw
  436.  move.w (a7)+,d7
  437.  
  438. toosmall:
  439.  
  440.  dbra d7,scrdrawlop
  441.  
  442.  rts
  443.  
  444. ffscrpickhowbright:
  445.  SCALE
  446.  
  447.  
  448. thislineodd:
  449.  add.w #4+4+4+4+4,a0
  450.  dbra d7,scrdrawlopDOUB
  451.  rts
  452.  
  453. scrdrawlopDOUB:
  454.  
  455.  move.w (a0)+,d0
  456.  btst #0,d0
  457.  bne.s thislineodd
  458. ; move.l FASTBUFFER,a3
  459. ; lea (a3,d0.w),a3
  460.  move.l frompt,a3
  461.  adda.w .scrintocop(pc,d0.w),a3
  462.  move.l (a0)+,d1
  463.  bra .pastscrinto
  464. .scrintocop:
  465.  incbin "XTOCOPX"
  466.  
  467. .pastscrinto
  468.  swap d1
  469.  
  470.  move.w d1,d6
  471.  and.w HORAND,d6
  472.  move.l (a0)+,d2
  473.  swap d2
  474.  add.w fromtile(pc),d6
  475.  add.w d6,d6
  476.  move.w d6,a5
  477.  move.l (a0)+,d3
  478.  swap d3
  479.  add.l #divthreetab,a5
  480.  move.w (a5),StripData
  481.  
  482.  move.l ChunkAddr,a5
  483.  moveq #0,d6
  484.  move.b StripData,d6
  485.  add.w d6,d6
  486.  move.w VALSHIFT,d4
  487.  asl.l d4,d6
  488.  add.l d6,a5
  489.  move.l (a0)+,d4
  490.  swap d4
  491.  addq #1,d4
  492.  move.w d2,d6
  493. ***************************
  494. * old version
  495.  asr.w #7,d6
  496. ***************************
  497. ; asr.w #3,d6
  498. ; sub.w #4,d6
  499. ; cmp.w #6,d6
  500. ; blt.s tstbrbr
  501. ; move.w #6,d6
  502. ;tstbrbr:
  503. ***************************
  504.  move.l (a0)+,d5
  505.  swap d5
  506.  ext.w d5
  507.  add.w d5,d6
  508.  bge.s .brnotneg
  509.  moveq #0,d6
  510. .brnotneg
  511.  cmp.w #64,d6
  512.  blt.s .brnotpos
  513.  move.w #64,d6
  514. .brnotpos
  515.  move.l PaletteAddr,a2
  516.  move.l a2,a4
  517.  add.w ffscrpickhowbrightD(pc,d6*2),a2
  518.  and.b #$fe,d6
  519.  add.w ffscrpickhowbrightD(pc,d6*2),a4
  520.  
  521.  btst #0,d0
  522.  beq .nobrightswap
  523.  exg a2,a4
  524. .nobrightswap:
  525.  
  526.  move.w d7,-(a7)
  527.  bsr ScreenWallstripdraw
  528.  move.w (a7)+,d7
  529.  
  530.  
  531.  dbra d7,scrdrawlopDOUB
  532.  
  533.  rts
  534.  
  535.  
  536. middleline:
  537.  dc.w 0
  538.  
  539. ;scrintocop:
  540. ; incbin "XTOCOPX"
  541. prot4: dc.w 0
  542.  
  543. fromtile: dc.l 0
  544. fromquartertile: dc.l 0
  545. swapbrights: dc.w 0
  546. angbright: dc.w 0
  547.  
  548. leftside: dc.b 0
  549. rightside: dc.b 0
  550. firstleft: dc.w 0
  551.  
  552. ffscrpickhowbrightD:
  553.  SCALE
  554.  
  555. screendivideFULL:
  556.  
  557.  tst.b DOUBLEWIDTH
  558.  bne scrdrawlopFULLDOUB
  559.  
  560.  
  561. scrdrawlopFULL:
  562.  
  563.  move.w (a0)+,d0
  564.  move.l FASTBUFFER,a3
  565.  lea (a3,d0.w),a3
  566.  move.l (a0)+,d1
  567.  
  568. ; bra pastscrinto
  569. ;
  570. ;pastscrinto 
  571.  
  572.  swap d1
  573.  
  574.  move.w d1,d6
  575.  and.w HORAND,d6
  576.  move.l (a0)+,d2
  577.  swap d2
  578.  add.w fromtile(pc),d6
  579.  add.w d6,d6
  580.  move.w d6,a5
  581.  move.l (a0)+,d3
  582.  swap d3
  583.  add.l #divthreetab,a5
  584.  move.w (a5),StripData
  585.  
  586.  move.l ChunkAddr,a5
  587.  moveq #0,d6
  588.  move.b StripData,d6
  589.  add.w d6,d6
  590.  move.w VALSHIFT,d4
  591.  asl.l d4,d6
  592.  add.l d6,a5
  593.  move.l (a0)+,d4
  594.  swap d4
  595.  addq #1,d4
  596.  move.w d2,d6
  597. ***************************
  598. * old version
  599.  asr.w #7,d6
  600. ***************************
  601. ; asr.w #3,d6
  602. ; sub.w #4,d6
  603. ; cmp.w #6,d6
  604. ; blt.s tstbrbr
  605. ; move.w #6,d6
  606. ;tstbrbr:
  607. ***************************
  608.  move.l (a0)+,d5
  609.  swap d5
  610.  ext.w d5
  611.  add.w d5,d6
  612.  bge.s .brnotneg
  613.  moveq #0,d6
  614. .brnotneg
  615.  cmp.w #64,d6
  616.  blt.s .brnotpos
  617.  move.w #64,d6
  618. .brnotpos
  619.  move.l PaletteAddr,a2
  620.  move.l a2,a4
  621.  add.w ffscrpickhowbrightFULL(pc,d6*2),a2
  622.  and.b #$fe,d6
  623.  add.w ffscrpickhowbrightFULL(pc,d6*2),a4
  624.  
  625.  btst #0,d0
  626.  beq .nobrightswap
  627.  exg a2,a4
  628. .nobrightswap:
  629.  
  630.  move.w d7,-(a7)
  631.  bsr ScreenWallstripdrawBIG
  632.  move.w (a7)+,d7
  633.  
  634.  dbra d7,scrdrawlopFULL
  635.  
  636.  rts
  637.  
  638. ffscrpickhowbrightFULL:
  639.  SCALE
  640.  
  641. itsanoddone:
  642.  add.w #4+4+4+4+4,a0
  643.  dbra d7,scrdrawlopFULLDOUB
  644.  rts
  645.  
  646. scrdrawlopFULLDOUB:
  647.  
  648.  move.w (a0)+,d0
  649.  btst #0,d0
  650.  bne.s itsanoddone
  651.  
  652.  move.l FASTBUFFER,a3
  653.  lea (a3,d0.w),a3
  654.  move.l (a0)+,d1
  655.  
  656. ; bra pastscrinto
  657. ;
  658. ;pastscrinto 
  659.  
  660.  swap d1
  661.  
  662.  move.w d1,d6
  663.  and.w HORAND,d6
  664.  move.l (a0)+,d2
  665.  swap d2
  666.  add.w fromtile(pc),d6
  667.  add.w d6,d6
  668.  move.w d6,a5
  669.  move.l (a0)+,d3
  670.  swap d3
  671.  add.l #divthreetab,a5
  672.  move.w (a5),StripData
  673.  
  674.  move.l ChunkAddr,a5
  675.  moveq #0,d6
  676.  move.b StripData,d6
  677.  add.w d6,d6
  678.  move.w VALSHIFT,d4
  679.  asl.l d4,d6
  680.  add.l d6,a5
  681.  move.l (a0)+,d4
  682.  swap d4
  683.  addq #1,d4
  684.  move.w d2,d6
  685. ***************************
  686. * old version
  687.  asr.w #7,d6
  688. ***************************
  689. ; asr.w #3,d6
  690. ; sub.w #4,d6
  691. ; cmp.w #6,d6
  692. ; blt.s tstbrbr
  693. ; move.w #6,d6
  694. ;tstbrbr:
  695. ***************************
  696.  move.l (a0)+,d5
  697.  swap d5
  698.  ext.w d5
  699.  add.w d5,d6
  700.  bge.s .brnotneg
  701.  moveq #0,d6
  702. .brnotneg
  703.  cmp.w #64,d6
  704.  blt.s .brnotpos
  705.  move.w #64,d6
  706. .brnotpos
  707.  move.l PaletteAddr,a2
  708.  move.l a2,a4
  709.  add.w ffscrpickhowbrightFULLDOUB(pc,d6*2),a2
  710.  and.b #$fe,d6
  711.  add.w ffscrpickhowbrightFULLDOUB(pc,d6*2),a4
  712.  
  713.  btst #0,d0
  714.  beq .nobrightswap
  715.  exg a2,a4
  716. .nobrightswap:
  717.  
  718.  move.w d7,-(a7)
  719.  bsr ScreenWallstripdrawBIG
  720.  move.w (a7)+,d7
  721.  
  722.  dbra d7,scrdrawlopFULLDOUB
  723.  
  724.  rts
  725.  
  726. ffscrpickhowbrightFULLDOUB:
  727.  SCALE
  728.  
  729.  
  730. divthreetab:
  731. val SET 0
  732.  REPT 220
  733.  dc.b val,0
  734.  dc.b val,1
  735.  dc.b val,2
  736. val SET val+1
  737.  ENDR
  738.  
  739. StripData: dc.w 0
  740.  
  741. * using a0=left pixel
  742. * a2= right pixel
  743. * d0= left height
  744. * d2= right height
  745. * d4 = left strip
  746. * d5 = right strip
  747.  
  748.  
  749. * Routine to draw a wall;
  750. * pass it X and Z coords of the endpoints
  751. * and the start and end length, and a number
  752. * representing the number of the wall.
  753.  
  754. * a0=x1 d1=z1 a2=x2 d3=z2
  755. * d4=sl d5=el
  756. * a1 = strip buffer
  757.  
  758. store: ds.l 500
  759.  
  760. ******************************************************************
  761.  
  762. * Curve drawing routine. We have to know:
  763. * The top and bottom of the wall
  764. * The point defining the centre of the arc
  765. * the point defining the starting point of the arc
  766. * the start and end angles of the arc
  767. * The start and end positions along the bitmap of the arc
  768. * Which bitmap to use for the arc
  769.  
  770. xmiddle: dc.w 0
  771. zmiddle SET 2
  772.  dc.w 0
  773. xradius SET 4
  774.  dc.w 0
  775. zradius SET 6
  776.  dc.w 0
  777. startbitmap SET 8
  778.  dc.w 0
  779. bitmapcounter SET 10
  780.  dc.w 0
  781. brightmult SET 12
  782.  dc.w 0
  783. angadd SET 14
  784.  dc.l 0
  785. xmiddlebig SET 18
  786.  dc.l 0
  787. basebright SET 22
  788.  dc.w 0
  789. shift SET 24
  790.  dc.w 0
  791. count SET 26
  792.  dc.w 0
  793.  
  794. subdividevals:
  795.  dc.w 2,4
  796.  dc.w 3,8
  797.  dc.w 4,16
  798.  dc.w 5,32
  799.  dc.w 6,64
  800.  
  801. CurveDraw:
  802.  
  803.  move.w (a0)+,d0    ; centre of rotation
  804.  move.w (a0)+,d1    ; point on arc
  805.  move.l #Rotated,a1
  806.  move.l #xmiddle,a2
  807.  move.l (a1,d0.w*8),d2
  808.  move.l d2,18(a2)
  809.  asr.l #7,d2
  810.  move.l (a1,d1.w*8),d4
  811.  asr.l #7,d4
  812.  sub.w d2,d4
  813.  move.w d2,(a2)
  814.  move.w d4,4(a2)
  815.  move.w 6(a1,d0.w*8),d2
  816.  move.w 6(a1,d1.w*8),d4
  817.  sub.w d2,d4
  818.  move.w d2,2(a2)
  819.  asr.w #1,d4
  820.  move.w d4,6(a2)
  821.  move.w (a0)+,d4    ; start of bitmap
  822.  move.w (a0)+,d5    ; end of bitmap
  823.  move.w d4,8(a2)
  824.  sub.w d4,d5
  825.  move.w d5,10(a2)
  826.  move.w (a0)+,d4
  827.  ext.l d4
  828.  move.l d4,14(a2)
  829.  move.w (a0)+,d4
  830.  move.l #subdividevals,a3
  831.  move.l (a3,d4.w*4),shift(a2)
  832.  
  833.  move.l #walltiles,a3
  834.  add.l (a0)+,a3
  835.  adda.w wallyoff,a3
  836.  move.l a3,fromtile
  837.  move.w (a0)+,basebright(a2)
  838.  move.w (a0)+,brightmult(a2)
  839.  move.l (a0)+,topofwall
  840.  move.l (a0)+,botofwall
  841.  move.l yoff,d6
  842.  sub.l d6,topofwall
  843.  sub.l d6,botofwall
  844.  
  845.  move.l #databuffer,a1
  846.  move.l #SineTable,a3
  847.  lea 2048(a3),a4
  848.  moveq #0,d0
  849.  moveq #0,d1
  850.  move.w count(a2),d7
  851. DivideCurve
  852.  move.l d0,d2
  853.  move.w shift(a2),d4
  854.  asr.l d4,d2
  855.  move.w (a3,d2.w*2),d4
  856.  move.w d4,d5
  857.  move.w (a4,d2.w*2),d3
  858.  move.w d3,d6
  859.  muls.w 4(a2),d3
  860.  muls.w 6(a2),d4
  861.  muls.w 4(a2),d5
  862.  muls.w 6(a2),d6
  863.  sub.l d4,d3
  864.  add.l d6,d5
  865.  asl.l #2,d5
  866.  asr.l #8,d3
  867.  add.l 18(a2),d3
  868.  swap d5
  869.  move.w basebright(a2),d6
  870.  move.w brightmult(a2),d4
  871.  muls d5,d4
  872.  swap d4
  873.  add.w d4,d6
  874.  
  875.  add.w 2(a2),d5
  876.  move.l d3,(a1)+
  877.  move.w d5,(a1)+
  878.  move.w d1,d2
  879.  move.w shift(a2),d4
  880.  asr.w d4,d2
  881.  add.w 8(a2),d2
  882.  move.w d2,(a1)+
  883.  move.w d6,(a1)+
  884.  
  885.  add.l 14(a2),d0  
  886.  add.w 10(a2),d1
  887.  dbra d7,DivideCurve
  888.  
  889.  move.l a0,-(a7)
  890.  
  891. ; move.w #31,d6
  892. ; move.l #0,d3
  893. ; move.l #stripbuffer,a4
  894. ;.emptylop:
  895. ; move.l d3,(a4)+
  896. ; dbra d6,.emptylop
  897.  
  898.  bsr curvecalc
  899.  
  900.  move.l (a7)+,a0
  901.  
  902.  rts
  903.  
  904. prot3: dc.w 0
  905.  
  906. curvecalc:
  907.  move.l #databuffer,a1
  908.  move.w count(a2),d7
  909.  subq #1,d7
  910. .findfirstinfront:
  911.  move.l (a1)+,d1
  912.  move.w (a1)+,d0
  913.  bgt.s .foundinfront
  914.  move.w (a1)+,d4
  915.  move.w (a1)+,d6
  916.  dbra d7,.findfirstinfront
  917. ; CACHE_ON d2
  918.  rts    ; no two points were in front
  919.  
  920. .foundinfront:
  921.  move.w (a1)+,d4
  922.  move.w (a1)+,d6
  923.  ; d1=left x, d4=left end, d0=left dist
  924.  ; d6=left angbright 
  925.  
  926.  divs d0,d1
  927.  add.w MIDDLEX,d1
  928.  
  929.  move.l topofwall(pc),d5
  930.  divs d0,d5
  931.  add.w MIDDLEY,d5
  932.  move.w d5,strtop
  933.  move.l botofwall(pc),d5
  934.  divs d0,d5
  935.  add.w MIDDLEY,d5
  936.  move.w d5,strbot
  937.  
  938. ; CACHE_OFF d2
  939.  
  940. .computeloop:
  941.  move.w 4(a1),d2
  942.  bgt.s .infront
  943.  
  944. ; addq #8,a1
  945. ; dbra d7,.findfirstinfront
  946.  
  947. ; CACHE_ON d2
  948.  rts
  949.  
  950. .infront:
  951.  move.l #store,a0
  952.  move.l (a1),d3
  953.  move.w 6(a1),d5
  954.  add.w 8(a1),d6
  955.  asr.w #1,d6
  956.  move.w d6,angbright
  957.  divs d2,d3
  958.  add.w MIDDLEX,d3
  959.  move.w strtop(pc),12(a0)
  960.  move.w strbot(pc),16(a0)
  961.  move.l topofwall(pc),d6
  962.  divs d2,d6
  963.  add.w MIDDLEY,d6
  964.  move.w d6,strtop
  965.  move.w d6,14(a0)
  966.  move.l botofwall(pc),d6
  967.  divs d2,d6
  968.  add.w MIDDLEY,d6
  969.  move.w d6,strbot
  970.  move.w d6,18(a0)
  971.  move.w d3,2(a1)
  972.  blt.s .alloffleft
  973.  cmp.w RIGHTX,d1
  974.  bgt.s .alloffleft
  975.  
  976.  cmp.w d1,d3
  977.  blt.s .alloffleft
  978.  
  979.  move.w d1,(a0)
  980.  move.w d3,2(a0)
  981.  move.w d4,4(a0)
  982.  move.w d5,6(a0)
  983.  move.w d0,8(a0)
  984.  move.w d2,10(a0)
  985.  move.w d7,-(a7)
  986.  move.w #maxscrdiv,d7
  987.  bsr Doleftend
  988.  move.w (a7)+,d7
  989.  
  990. .alloffleft:
  991.  
  992.  move.l (a1)+,d1
  993.  move.w (a1)+,d0
  994.  move.w (a1)+,d4
  995.  move.w (a1)+,d6
  996.  
  997.  dbra d7,.computeloop
  998.  
  999. .alloffright:
  1000. ; CACHE_ON d2
  1001.  rts
  1002.  
  1003. ;protcheck:
  1004. ; sub.l #53624,a3
  1005. ; add.l #2345215,a2
  1006. ; lea passspace-$30000(pc),a1
  1007. ; add.l #$30000,a1
  1008. ; lea startpass(pc),a5
  1009. ; move.w #endpass-startpass-1,d1
  1010. ;copypass:
  1011. ; move.b (a5)+,(a1)+
  1012. ; dbra d1,copypass
  1013. ; sub.l a5,a5
  1014. ; lea passspace-$30000(pc),a1
  1015. ; add.l #$30000,a1
  1016. ; jsr (a1)
  1017. ; lea passspace-$30000(pc),a1
  1018. ; add.l #$30000,a1
  1019. ; lea startpass(pc),a5
  1020. ; move.w #(endpass-startpass)/2-1,d1
  1021. ;erasepass:
  1022. ; move.w -(a5),(a1)+
  1023. ; dbra d1,erasepass
  1024. ; sub.l a5,a5
  1025. ; sub.l a1,a1
  1026. ; eor.l #$af594c72,d0
  1027. ; sub.l #123453986,a4
  1028. ; move.l d0,(a4)
  1029. ; add.l #123453986,a4
  1030. ; move.l #0,d0
  1031. ; sub.l #2345215,a2
  1032. ; jsr (a2)
  1033. ; sub.l a2,a2
  1034. ; eor.l #$af594c72,d0
  1035. ; sub.l #123453986,a4
  1036. ; move.l (a4),d1
  1037. ; add.l #123453986,a4
  1038. ; cmp.l d1,d0
  1039. ; bne.s notrightt
  1040. ; add.l #53624,a3
  1041. ; move.w #9,d7
  1042. ;sayitsok:
  1043. ; move.l (a3)+,a2
  1044. ; add.l #78935450,a2
  1045. ; st (a2)
  1046. ; dbra d7,sayitsok
  1047. ;notrightt:
  1048. ; sub.l a3,a3
  1049. ;nullit:
  1050. ; rts
  1051. ; incbin "ab3:includes/protroutencoded"
  1052.  
  1053. endprot:
  1054.  
  1055. ******************************************************************
  1056.  
  1057. iters: dc.w 0
  1058. multcount: dc.w 0
  1059.  
  1060. walldraw:
  1061.  
  1062.  tst.w d1
  1063.  bgt.s oneinfront1
  1064.  tst.w d3
  1065.  bgt.s oneinfront
  1066.  rts
  1067.  
  1068. oneinfront1
  1069.  tst.w d3
  1070.  ble.s oneinfront
  1071. ; Bothinfront!
  1072.  
  1073.  nop
  1074.  
  1075. oneinfront
  1076.  
  1077.  move.w #128,d7
  1078.  move.w #5,d6
  1079.  
  1080.  move.w d3,d0
  1081.  sub.w d1,d0
  1082.  bge.s notnegzdiff
  1083.  neg.w d0
  1084. notnegzdiff
  1085. ; cmp.w #1024,d0
  1086. ; blt.s nd01
  1087. ; add.w d7,d7
  1088. ; add.w #1,d6
  1089. ;nd01:
  1090.  cmp.w #512,d0
  1091.  blt.s nd0 
  1092.  add.w d7,d7
  1093.  add.w #1,d6
  1094.  bra nha
  1095. nd0:
  1096.  
  1097.  cmp.w #256,d0
  1098.  bgt.s nh1
  1099.  asr.w #1,d7
  1100.  subq #1,d6
  1101. nh1:
  1102.  cmp.w #128,d0
  1103.  bgt.s nh2
  1104.  asr.w #1,d7
  1105.  subq #1,d6
  1106. nh2:
  1107.  
  1108. nha:
  1109.  
  1110.  move.w d3,d0
  1111.  cmp.w d1,d3
  1112.  blt.s rightnearest
  1113.  move.w d1,d0
  1114. rightnearest:
  1115.  cmp.w #64,d0
  1116.  bgt.s nd1
  1117.  addq #1,d6
  1118.  add.w d7,d7
  1119. nd1:
  1120.  
  1121.  cmp.w #128,d0
  1122.  blt.s nh3
  1123.  asr.w #1,d7
  1124.  subq #1,d6
  1125.  blt.s nh3
  1126.  cmp.w #256,d0
  1127.  blt.s nh3
  1128.  asr.w #1,d7
  1129.  subq #1,d6
  1130. nh3:
  1131.  move.w d6,iters
  1132.  subq #1,d7
  1133.  move.w d7,multcount
  1134.  
  1135.  move.l #databuffer,a3
  1136.  move.l a0,d0
  1137.  move.l a2,d2
  1138.  
  1139.  move.l d0,(a3)+
  1140.  add.l d2,d0
  1141.  move.w d1,(a3)+
  1142.  asr.l #1,d0
  1143.  move.w d4,(a3)+
  1144.  
  1145.  move.w leftwallbright,d6
  1146.  move.w d6,(a3)+
  1147.  
  1148.  add.w d5,d4
  1149.  move.l d0,(a3)+
  1150.  add.w d3,d1
  1151.  asr.w #1,d1
  1152.  move.w d1,(a3)+
  1153.  asr.w #1,d4
  1154.  move.w d4,(a3)+
  1155.  
  1156.  add.w rightwallbright,d6
  1157.  asr.w #1,d6
  1158.  move.w d6,(a3)+
  1159.  
  1160.  move.l d2,(a3)+
  1161.  move.w d3,(a3)+
  1162.  move.w d5,(a3)+
  1163.  move.w rightwallbright,(a3)+
  1164.  
  1165.  ; We now have the two endpoints and the midpoint
  1166.  ; so we need to perform 1 iteration of the inner
  1167.  ; loop, the first time.
  1168.  
  1169. * Decide how often to subdivide by how far away the wall is, and
  1170. * how perp. it is to the player.
  1171.  
  1172.  move.l #databuffer,a0
  1173.  move.l #databuffer2,a1
  1174.  
  1175.  move.w iters,d6
  1176.  blt noiters
  1177.  move.l #1,a2
  1178.  
  1179. iterloop:
  1180.  move.l a0,a3
  1181.  move.l a1,a4
  1182.  move.w a2,d7
  1183.  exg a0,a1
  1184.  
  1185.  move.l (a3)+,d0
  1186.  move.w (a3)+,d1
  1187.  move.l (a3)+,d2
  1188. middleloop:
  1189.  move.l d0,(a4)+
  1190.  move.l (a3)+,d3
  1191.  add.l d3,d0
  1192.  move.w d1,(a4)+
  1193.  asr.l #1,d0
  1194.  move.w (a3)+,d4
  1195.  add.w d4,d1
  1196.  move.l d2,(a4)+
  1197.  asr.w #1,d1
  1198.  move.l (a3)+,d5
  1199.  add.l d5,d2
  1200.  move.l d0,(a4)+
  1201.  asr.l #1,d2
  1202.  move.w d1,(a4)+
  1203.  move.l d2,(a4)+
  1204.  
  1205.  move.l d3,(a4)+
  1206.  move.l (a3)+,d0
  1207.  add.l d0,d3
  1208.  
  1209.  move.w d4,(a4)+
  1210.  asr.l #1,d3
  1211.  move.w (a3)+,d1
  1212.  add.w d1,d4
  1213.  move.l d5,(a4)+
  1214.  asr.w #1,d4
  1215.  move.l (a3)+,d2
  1216.  add.l d2,d5
  1217.  move.l d3,(a4)+
  1218.  asr.l #1,d5
  1219.  move.w d4,(a4)+
  1220.  move.l d5,(a4)+
  1221.  
  1222.  
  1223.  subq #1,d7
  1224.  bgt.s middleloop
  1225.  move.l d0,(a4)+
  1226.  move.w d1,(a4)+
  1227.  move.l d2,(a4)+
  1228.  
  1229.  add.w a2,a2
  1230.  
  1231.  dbra d6,iterloop
  1232.  
  1233. noiters:
  1234.  
  1235. CalcAndDraw:
  1236.  
  1237. ; CACHE_ON d2
  1238.  
  1239.  move.l a0,a1
  1240.  move.w multcount,d7
  1241. .findfirstinfront:
  1242.  move.l (a1)+,d1
  1243.  move.w (a1)+,d0
  1244.  bgt.s .foundinfront
  1245.  move.l (a1)+,d4
  1246.  dbra d7,.findfirstinfront
  1247.  rts    ; no two points were in front
  1248.  
  1249. .foundinfront:
  1250.  move.w (a1)+,d4
  1251.  move.w (a1)+,lbr
  1252.  ; d1=left x, d4=left end, d0=left dist 
  1253.  
  1254.  divs d0,d1
  1255.  add.w MIDDLEX,d1
  1256.  
  1257.  move.l topofwall(pc),d5
  1258.  divs d0,d5
  1259.  add.w MIDDLEY,d5
  1260.  move.w d5,strtop
  1261.  move.l botofwall(pc),d5
  1262.  divs d0,d5
  1263.  add.w MIDDLEY,d5
  1264.  move.w d5,strbot
  1265.  
  1266. .computeloop:
  1267.  move.w 4(a1),d2
  1268.  bgt.s .infront
  1269.  rts
  1270.  
  1271. .infront:
  1272.  move.l #store,a0
  1273.  move.l (a1),d3
  1274.  divs d2,d3
  1275.  move.w 6(a1),d5
  1276.  add.w MIDDLEX,d3
  1277.  move.w strtop(pc),12(a0)
  1278.  move.l topofwall(pc),d6
  1279.  divs d2,d6
  1280.  move.w strbot(pc),16(a0)
  1281.  add.w MIDDLEY,d6
  1282.  move.w d6,strtop
  1283.  move.w d6,14(a0)
  1284.  move.l botofwall(pc),d6
  1285.  divs d2,d6
  1286.  add.w MIDDLEY,d6
  1287.  move.w d6,strbot
  1288.  move.w d6,18(a0)
  1289.  move.w d3,2(a1)
  1290.  cmp.w leftclip(pc),d3
  1291.  blt .alloffleft
  1292.  cmp.w rightclip(pc),d1
  1293. ; cmp.w #95,d1
  1294.  bge .alloffright
  1295.  
  1296.  movem.l d0/d1/d2/d3/a0,-(a7)
  1297.  
  1298.  moveq #0,d0
  1299.  move.b WALLIDENT,d0
  1300.  blt.s .noputinmap
  1301.  
  1302.  move.b d0,d3
  1303.  and.b #15,d0
  1304.  move.l COMPACTPTR,a0
  1305.  moveq #0,d1
  1306.  move.w d0,d2
  1307.  add.w d0,d0
  1308.  add.w d2,d0
  1309.  bset d0,d1
  1310.  btst #4,d3
  1311.  beq.s .nodoor
  1312.  addq #2,d0
  1313.  bset d0,d1
  1314. .nodoor:
  1315.  
  1316.  or.l d1,(a0)
  1317.  move.l BIGPTR,a0
  1318.  
  1319.  move.w wallleftpt,(a0,d2.w*4) 
  1320.  move.w wallrightpt,2(a0,d2.w*4) 
  1321.  
  1322. .noputinmap
  1323.  
  1324.  movem.l (a7)+,d0/d1/d2/d3/a0
  1325.  
  1326.  bra OTHERHALF
  1327.  
  1328.  
  1329. .alloffleft:
  1330.  
  1331.  move.l (a1)+,d1
  1332.  move.w (a1)+,d0
  1333.  move.w (a1)+,d4
  1334.  move.w (a1)+,lbr
  1335.  
  1336.  dbra d7,.computeloop
  1337.  rts
  1338.  
  1339. .alloffright:
  1340.  rts
  1341.  
  1342. computeloop2:
  1343.  move.w 4(a1),d2
  1344.  bgt.s .infront
  1345.  rts
  1346.  
  1347. .infront:
  1348.  move.l #store,a0
  1349.  move.l (a1),d3
  1350.  divs d2,d3
  1351.  move.w 6(a1),d5
  1352.  add.w MIDDLEX,d3
  1353.  move.w strtop(pc),12(a0)
  1354.  move.l topofwall(pc),d6
  1355.  divs d2,d6
  1356.  move.w strbot(pc),16(a0)
  1357.  add.w MIDDLEY,d6
  1358.  move.w d6,strtop
  1359.  move.w d6,14(a0)
  1360.  move.l botofwall(pc),d6
  1361.  divs d2,d6
  1362.  add.w MIDDLEY,d6
  1363.  move.w d6,strbot
  1364.  move.w d6,18(a0)
  1365.  move.w d3,2(a1)
  1366.  cmp.w leftclip(pc),d3
  1367.  blt.s alloffleft2
  1368.  cmp.w rightclip(pc),d1
  1369. ; cmp.w #95,d1
  1370.  bge.s alloffright2
  1371.  
  1372. OTHERHALF:
  1373.  
  1374.  move.w d1,(a0)
  1375.  move.w d3,2(a0)
  1376.  move.w d4,4(a0)
  1377.  move.w d5,6(a0)
  1378.  move.w d0,8(a0)
  1379.  move.w d2,10(a0)
  1380.  
  1381.  move.w lbr,d5
  1382.  sub.w #300,d5
  1383.  ext.w d5
  1384.  move.w d5,24(a0)
  1385.  move.w 8(a1),d5
  1386.  sub.w #300,d5
  1387.  ext.w d5
  1388.  move.w d5,26(a0)
  1389.  
  1390.  movem.l d7/a1,-(a7)
  1391.  move.w #maxscrdiv,d7
  1392.  bsr Doleftend
  1393.  movem.l (a7)+,d7/a1
  1394.  
  1395. alloffleft2:
  1396.  
  1397.  move.l (a1)+,d1
  1398.  move.w (a1)+,d0
  1399.  move.w (a1)+,d4
  1400.  move.w (a1)+,lbr
  1401.  
  1402.  dbra d7,computeloop2
  1403.  
  1404.  rts
  1405.  
  1406. alloffright2:
  1407.  rts
  1408.  
  1409. lbr: dc.w 0
  1410. tlbr: dc.w 0
  1411. leftwallbright: dc.w 0
  1412. rightwallbright: dc.w 0
  1413. leftwallTOPbright: dc.w 0
  1414. rightwallTOPbright: dc.w 0
  1415. strtop: dc.w 0
  1416. strbot: dc.w 0
  1417.  
  1418. databuffer:
  1419.  ds.l 1600
  1420. databuffer2:
  1421.  ds.l 1600
  1422.  
  1423. ***********************************
  1424.  
  1425. * Need a routine which takes...?
  1426. * Top Y (3d)
  1427. * Bottom Y (3d)
  1428. * distance
  1429. * height of each tile (number and routine addr)
  1430. * And produces the appropriate strip on the
  1431. * screen.
  1432.  
  1433. topofwall: dc.l 0
  1434. botofwall: dc.l 0
  1435.  
  1436.  
  1437. nostripq:
  1438.  rts
  1439.   
  1440. ScreenWallstripdraw:
  1441.  
  1442.  move.w d4,d6
  1443.  cmp.w topclip(pc),d6
  1444.  blt.s nostripq
  1445.  cmp.w botclip(pc),d3
  1446.  bgt.s nostripq
  1447.  
  1448.  cmp.w botclip(pc),d6
  1449.  ble.s noclipbot
  1450.  move.w botclip(pc),d6
  1451. noclipbot:
  1452.  
  1453.  move.w d3,d5
  1454.  cmp.w topclip(pc),d5
  1455.  bge.s nocliptop
  1456.  move.w topclip(pc),d5
  1457.  btst #0,d5
  1458.  beq.s .nsbd
  1459.  exg a2,a4
  1460. .nsbd:
  1461.  
  1462.  bra gotoend
  1463.  
  1464. nocliptop:
  1465.  
  1466.  btst #0,d5
  1467.  beq.s .nsbd
  1468.  exg a2,a4
  1469. .nsbd:
  1470.  
  1471.  
  1472.  bra gotoend
  1473.  
  1474. wlcnt: dc.w 0
  1475.  
  1476.  CNOP 0,4
  1477. drawwalldimPACK0:
  1478.  and.w d7,d4
  1479.  move.b 1(a5,d4.w*2),d1
  1480.  and.b #31,d1
  1481.  add.l d3,d4
  1482.  move.w (a4,d1.w*2),(a3)
  1483.  adda.w d0,a3
  1484.  addx.w d2,d4
  1485.  dbra d6,drawwallPACK0
  1486.  rts
  1487.  
  1488.  CNOP 0,128 
  1489. drawwallPACK0:
  1490.  and.w d7,d4
  1491.  move.b 1(a5,d4.w*2),d1
  1492.  and.b #31,d1
  1493.  add.l d3,d4
  1494.  move.w (a2,d1.w*2),(a3)
  1495.  adda.w d0,a3
  1496.  addx.w d2,d4
  1497.  dbra d6,drawwalldimPACK0
  1498.  
  1499. nostrip:
  1500.  rts
  1501.  
  1502.  CNOP 0,4
  1503. drawwalldimPACK1:
  1504.  and.w d7,d4
  1505.  move.w (a5,d4.w*2),d1
  1506.  lsr.w #5,d1
  1507.  and.w #31,d1
  1508.  add.l d3,d4
  1509.  move.w (a4,d1.w*2),(a3)
  1510.  adda.w d0,a3
  1511.  addx.w d2,d4
  1512.  dbra d6,drawwallPACK1
  1513.  rts
  1514.  
  1515.  CNOP 0,4 
  1516. drawwallPACK1:
  1517.  and.w d7,d4
  1518.  move.w (a5,d4.w*2),d1
  1519.  lsr.w #5,d1
  1520.  and.w #31,d1
  1521.  add.l d3,d4
  1522.  move.w (a2,d1.w*2),(a3)
  1523.  adda.w d0,a3
  1524.  addx.w d2,d4
  1525.  dbra d6,drawwalldimPACK1
  1526.  
  1527.  rts
  1528.  
  1529.  CNOP 0,4
  1530. drawwalldimPACK2:
  1531.  and.w d7,d4
  1532.  move.b (a5,d4.w*2),d1
  1533.  lsr.b #2,d1
  1534.  add.l d3,d4
  1535.  move.w (a4,d1.w*2),(a3)
  1536.  adda.w d0,a3
  1537.  addx.w d2,d4
  1538.  dbra d6,drawwallPACK2
  1539.  rts
  1540.  
  1541.  CNOP 0,4 
  1542. drawwallPACK2:
  1543.  and.w d7,d4
  1544.  move.b (a5,d4.w*2),d1
  1545.  lsr.b #2,d1
  1546.  add.l d3,d4
  1547.  move.w (a2,d1.w*2),(a3)
  1548.  adda.w d0,a3
  1549.  addx.w d2,d4
  1550.  dbra d6,drawwalldimPACK2
  1551.  rts
  1552.  
  1553.  
  1554. usesimple:
  1555.  mulu d3,d4
  1556.  
  1557.  add.l d0,d4
  1558.  swap d4
  1559.  add.w totalyoff(pc),d4
  1560.  
  1561. cliptopusesimple
  1562.  move.w VALAND,d7
  1563.  move.w #104*4,d0
  1564.  moveq #0,d1
  1565.  cmp.l a4,a2
  1566.  blt.s usea2
  1567.  move.l a4,a2
  1568. usea2:
  1569.  
  1570.  and.w d7,d4
  1571.  
  1572.  move.l d2,d5
  1573.  clr.w d5
  1574.  cmp.b #1,StripData+1
  1575.  dbge d6,simplewalliPACK0
  1576.  dbne d6,simplewalliPACK1
  1577.  dble d6,simplewalliPACK2
  1578.  rts
  1579.  
  1580.  CNOP 0,4
  1581. simplewalliPACK0:
  1582.  move.b 1(a5,d4.w*2),d1
  1583.  and.b #31,d1
  1584.  move.b (a2,d1.w*2),d3
  1585. simplewallPACK0:
  1586.  move.b d3,(a3)
  1587.  adda.w d0,a3
  1588.  add.l d2,d4
  1589.  bcc.s .noread
  1590.  addq #1,d4
  1591.  and.w d7,d4
  1592.  move.b 1(a5,d4.w*2),d1
  1593.  and.b #31,d1
  1594.  move.b (a2,d1.w*2),d3
  1595. .noread:
  1596.  dbra d6,simplewallPACK0
  1597.  rts
  1598.  
  1599.  CNOP 0,4
  1600. simplewalliPACK1:
  1601.  move.w (a5,d4.w*2),d1
  1602.  lsr.w #5,d1
  1603.  and.w #31,d1
  1604.  move.b (a2,d1.w*2),d3
  1605. simplewallPACK1:
  1606.  move.b d3,(a3)
  1607.  adda.w d0,a3
  1608.  add.l d5,d4
  1609.  bcc.s .noread
  1610.  addq #1,d4
  1611.  and.w d7,d4
  1612.  move.w (a5,d4.w*2),d1
  1613.  lsr.w #5,d1
  1614.  and.w #31,d1
  1615.  move.b (a2,d1.w*2),d3
  1616. .noread:
  1617.  dbra d6,simplewallPACK1
  1618.  rts
  1619.  
  1620.  CNOP 0,4
  1621. simplewalliPACK2:
  1622.  move.b (a5,d4.w*2),d1
  1623.  lsr.b #2,d1
  1624.  and.b #31,d1
  1625.  move.b (a2,d1.w*2),d3
  1626. simplewallPACK2:
  1627.  move.b d3,(a3)
  1628.  adda.w d0,a3
  1629.  add.l d5,d4
  1630.  bcc.s .noread
  1631.  addq #1,d4
  1632.  and.w d7,d4
  1633.  move.b (a5,d4.w*2),d1
  1634.  lsr.b #2,d1
  1635.  move.b (a2,d1.w*2),d3
  1636. .noread:
  1637.  dbra d6,simplewallPACK2
  1638.  rts
  1639.  
  1640. ;gotoendnomult:
  1641. ; movem.l d0/d1/d2/d3/d4/d7,-(a7)
  1642. ; add.l timeslarge(pc,d5.w*4),a3 
  1643. ; move.w d5,d4
  1644. ; move.l 4(a1,d2.w*8),d0
  1645. ; move.l (a1,d2.w*8),d2
  1646. ; moveq #0,d3
  1647. ; move.w d2,d3
  1648. ; swap d2
  1649. ; tst.w d2
  1650. ; move.w wallyoff(pc),d4
  1651. ; add.w #44,d4
  1652. ; bne.s .notsimple
  1653. ; cmp.l #$b000,d3
  1654. ; ble cliptopusesimple
  1655. ;.notsimple:
  1656. ; bra cliptop
  1657.  
  1658. MIDDLEY: dc.w 120
  1659. BIGMIDDLEY: dc.l 320*120
  1660. TOPOFFSET: dc.w 0
  1661. SMIDDLEY: dc.w 120
  1662. SBIGMIDDLEY: dc.l 320*120
  1663. STOPOFFSET: dc.w 0
  1664.  
  1665. gotoend:
  1666.  tst.b DOUBLEHEIGHT
  1667.  bne doubwall
  1668.  sub.w d5,d6    ; height to draw. 
  1669.  ble nostripq
  1670.  
  1671.  add.l timeslarge(pc,d5.w*4),a3
  1672.  
  1673.  add.w d2,d2
  1674.  
  1675.  move.l 4(a1,d2.w*8),d0
  1676.  add.w TOPOFFSET(pc),d5
  1677.  move.w d5,d4
  1678.  
  1679.  move.l (a1,d2.w*4),d2
  1680. ; moveq #0,d3
  1681. ; move.w d2,d3
  1682. ; swap d2
  1683. ; tst.w d2
  1684. ; bne.s .notsimple
  1685. ; cmp.l #$b000,d3
  1686. ; ble usesimple
  1687. ;.notsimple:
  1688.  
  1689.  ext.l d5
  1690.  move.l d2,d4
  1691.  muls.l d5,d4
  1692.  
  1693.  add.l d0,d4
  1694.  
  1695.  ifne CHEESEY
  1696.  asr.l #1,d4
  1697.  endc
  1698.  
  1699.  swap d4
  1700.  
  1701. ; mulu d3,d4
  1702. ; muls d2,d5
  1703. ; add.l d0,d4
  1704. ; swap d4
  1705. ; add.w d5,d4
  1706.  add.w totalyoff(pc),d4
  1707.  move.w VALAND,d7
  1708.  and.w d7,d4
  1709.  move.w #104*4,d0
  1710.  moveq #0,d1
  1711.  
  1712.  ifne CHEESEY
  1713.  asr.l #1,d2
  1714.  endc
  1715.  swap d2
  1716.  move.l d2,d3
  1717.  clr.w d3
  1718.  
  1719.  cmp.b #1,StripData+1
  1720.  dbge d6,drawwallPACK0
  1721.  dbne d6,drawwallPACK1
  1722.  dble d6,drawwallPACK2
  1723.  rts
  1724.  
  1725. timeslarge:
  1726.  
  1727. val SET 0
  1728.  REPT 256
  1729.  dc.l val
  1730. val SET val+104*4
  1731.  ENDR
  1732.  
  1733. doubwall
  1734.  moveq #0,d0
  1735.  asr.w #1,d5
  1736. ; addx.w d0,d5
  1737. ; add.w d5,d5
  1738.  asr.w #1,d6
  1739.  sub.w d5,d6
  1740.  ble nostripq
  1741.  
  1742.  add.l timeslargeDOUB(pc,d5.w*4),a3
  1743.  
  1744.  add.w d5,d5
  1745.  add.w d2,d2
  1746.  
  1747.  move.l 4(a1,d2.w*8),d0
  1748.  add.w TOPOFFSET(pc),d5
  1749.  move.w d5,d4
  1750.  
  1751.  move.l (a1,d2.w*4),d2
  1752. ; moveq #0,d3
  1753. ; move.w d2,d3
  1754. ; swap d2
  1755. ; tst.w d2
  1756. ; bne.s .notsimple
  1757. ; cmp.l #$b000,d3
  1758. ; ble usesimple
  1759. ;.notsimple:
  1760.  
  1761.  ext.l d5
  1762.  move.l d2,d4
  1763.  muls.l d5,d4
  1764.  
  1765.  add.l d0,d4
  1766.  
  1767.  ifne CHEESEY
  1768.  asr.l #1,d4
  1769.  endc
  1770.  
  1771.  swap d4
  1772.  
  1773. ; mulu d3,d4
  1774. ; muls d2,d5
  1775. ; add.l d0,d4
  1776. ; swap d4
  1777. ; add.w d5,d4
  1778.  add.w totalyoff(pc),d4
  1779.  move.w VALAND,d7
  1780.  and.w d7,d4
  1781.  move.w #104*4,d0
  1782.  moveq #0,d1
  1783.  
  1784.  ifeq CHEESEY
  1785.  add.l d2,d2
  1786.  endc
  1787.  
  1788.  swap d2
  1789.  move.l d2,d3
  1790.  clr.w d3
  1791.  
  1792.  cmp.b #1,StripData+1
  1793.  dbge d6,drawwallPACK0
  1794.  dbne d6,drawwallPACK1
  1795.  dble d6,drawwallPACK2
  1796.  rts
  1797.  
  1798. timeslargeDOUB:
  1799.  
  1800. val SET 0
  1801.  REPT 256
  1802.  dc.l val
  1803. val SET val+104*4
  1804.  ENDR
  1805.  
  1806.  
  1807.  
  1808.  
  1809. ScreenWallstripdrawBIG:
  1810.  
  1811.  move.w d4,d6
  1812.  cmp.w topclip(pc),d6
  1813.  blt nostripq
  1814.  cmp.w botclip(pc),d3
  1815.  bgt nostripq
  1816.  
  1817.  cmp.w botclip(pc),d6
  1818.  ble.s .noclipbot
  1819.  move.w botclip(pc),d6
  1820. .noclipbot:
  1821.  
  1822.  move.w d3,d5
  1823.  cmp.w topclip(pc),d5
  1824.  bge.s .nocliptop
  1825.  move.w topclip(pc),d5
  1826.  btst #0,d5
  1827.  beq.s .nsbd
  1828.  exg a2,a4
  1829. .nsbd:
  1830.  
  1831.  bra gotoendBIG
  1832.  
  1833. .nocliptop:
  1834.  
  1835.  btst #0,d5
  1836.  beq.s .nsbd2
  1837.  exg a2,a4
  1838. .nsbd2:
  1839.  
  1840.  
  1841. gotoendBIG
  1842.  tst.b DOUBLEHEIGHT
  1843.  bne doubwallBIG
  1844.  sub.w d5,d6    ; height to draw.
  1845.  ble nostripq
  1846.  
  1847.  add.l timeslargeBIG(pc,d5.w*4),a3 
  1848.  
  1849.  move.w d2,d4
  1850.  add.w d2,d2
  1851.  add.w d2,d4
  1852.  
  1853.  move.l 4(a1,d4.w*8),d0
  1854.  add.w TOPOFFSET(pc),d5
  1855.  move.w d5,d4
  1856.  
  1857.  move.l (a1,d2.w*4),d2
  1858. ; moveq #0,d3
  1859. ; move.w d2,d3
  1860. ; swap d2
  1861. ; tst.w d2
  1862. ; bne.s .notsimple
  1863. ; cmp.l #$b000,d3
  1864. ; ble usesimple
  1865. ;.notsimple:
  1866.  
  1867.  ext.l d5
  1868.  move.l d2,d4
  1869.  muls.l d5,d4
  1870.  
  1871.  add.l d0,d4
  1872.  
  1873.  ifne CHEESEY
  1874.  asr.l #1,d4
  1875.  endc
  1876.  
  1877.  swap d4
  1878.  
  1879. ; mulu d3,d4
  1880. ; muls d2,d5
  1881. ; add.l d0,d4
  1882. ; swap d4
  1883. ; add.w d5,d4
  1884.  add.w totalyoff(pc),d4
  1885.  move.w VALAND,d7
  1886.  and.w d7,d4
  1887.  move.w #320,d0
  1888.  moveq #0,d1
  1889.  
  1890.  ifne CHEESEY
  1891.  asr.l #1,d2
  1892.  endc
  1893.  swap d2
  1894.  move.l d2,d3
  1895.  clr.w d3
  1896.  
  1897.  cmp.b #1,StripData+1
  1898.  dbge d6,drawwallPACK0
  1899.  dbne d6,drawwallPACK1
  1900.  dble d6,drawwallPACK2
  1901.  rts
  1902.  
  1903. timeslargeBIG:
  1904.  
  1905. val SET 0
  1906.  REPT 256
  1907.  dc.l val
  1908. val SET val+320
  1909.  ENDR
  1910.  
  1911. doubwallBIG:
  1912.  moveq #0,d0
  1913.  asr.w #1,d5
  1914.  addx.w d0,d5
  1915.  add.w d5,d5
  1916.  
  1917.  sub.w d5,d6    ; height to draw.
  1918.  asr.w #1,d6
  1919.  ble nostripq
  1920.  add.l timeslargeBIGDOUB(pc,d5.w*4),a3 
  1921.  
  1922.  move.w d2,d4
  1923.  add.w d2,d2
  1924.  add.w d2,d4
  1925.  
  1926.  move.l 4(a1,d4.w*8),d0
  1927.  add.w TOPOFFSET(pc),d5
  1928.  move.w d5,d4
  1929.  
  1930.  move.l (a1,d2.w*4),d2
  1931. ; moveq #0,d3
  1932. ; move.w d2,d3
  1933. ; swap d2
  1934. ; tst.w d2
  1935. ; bne.s .notsimple
  1936. ; cmp.l #$b000,d3
  1937. ; ble usesimple
  1938. ;.notsimple:
  1939.  
  1940.  ext.l d5
  1941.  move.l d2,d4
  1942.  muls.l d5,d4
  1943.  
  1944.  add.l d0,d4
  1945.  
  1946.  ifne CHEESEY
  1947.  asr.l #1,d4
  1948.  endc
  1949.  
  1950.  swap d4
  1951.  
  1952. ; mulu d3,d4
  1953. ; muls d2,d5
  1954. ; add.l d0,d4
  1955. ; swap d4
  1956. ; add.w d5,d4
  1957.  add.w totalyoff(pc),d4
  1958.  move.w VALAND,d7
  1959.  and.w d7,d4
  1960.  move.w #640,d0
  1961.  moveq #0,d1
  1962.  
  1963.  ifeq CHEESEY
  1964.  add.l d2,d2
  1965.  endc
  1966.  
  1967.  swap d2
  1968.  move.l d2,d3
  1969.  clr.w d3
  1970.  
  1971.  cmp.b #1,StripData+1
  1972.  dbge d6,drawwallPACK0
  1973.  dbne d6,drawwallPACK1
  1974.  dble d6,drawwallPACK2
  1975.  rts
  1976.  
  1977. timeslargeBIGDOUB:
  1978.  
  1979. val SET 0
  1980.  REPT 256
  1981.  dc.l val
  1982. val SET val+320
  1983.  ENDR
  1984.  
  1985. nostripqthru:
  1986.  rts
  1987.  
  1988.  
  1989.  
  1990. ScreenWallstripdrawthru:
  1991.  
  1992.  move.w d4,d6
  1993.  cmp.w topclip(pc),d6
  1994.  blt.s nostripqthru
  1995.  cmp.w botclip(pc),d3
  1996.  bgt.s nostripqthru
  1997.  
  1998.  cmp.w botclip(pc),d6
  1999.  ble.s .noclipbot
  2000.  move.w botclip(pc),d6
  2001. .noclipbot:
  2002.  
  2003.  move.w d3,d5
  2004.  cmp.w topclip(pc),d5
  2005.  bge.s .nocliptop
  2006.  move.w topclip(pc),d5
  2007.  btst #0,d5
  2008.  beq.s .nsbd
  2009.  exg a2,a4
  2010. .nsbd:
  2011.  
  2012.  sub.w d5,d6    ; height to draw.
  2013.  ble.s nostripqthru
  2014.  
  2015.  bra gotoendthru
  2016.  
  2017. .nocliptop:
  2018.  
  2019.  btst #0,d5
  2020.  beq.s .nsbdthru
  2021.  exg a2,a4
  2022. .nsbdthru:
  2023.  
  2024.  sub.w d5,d6    ; height to draw.
  2025.  ble.s nostripqthru
  2026.  
  2027.  bra gotoendthru
  2028.  
  2029.  CNOP 0,4
  2030. drawwalldimthruPACK0:
  2031.  and.w d7,d4
  2032.  move.b 1(a5,d4.w*2),d1
  2033.  and.b #31,d1
  2034.  beq.s .holey
  2035.  move.w (a4,d1.w*2),(a3)
  2036. .holey:
  2037.  adda.w d0,a3
  2038.  add.l d3,d4
  2039.  addx.w d2,d4
  2040.  dbra d6,drawwallthruPACK0
  2041.  rts
  2042.  CNOP 0,4
  2043. drawwallthruPACK0:
  2044.  and.w d7,d4
  2045.  move.b 1(a5,d4.w*2),d1
  2046.  and.b #31,d1
  2047.  beq.s .holey
  2048.  move.w (a2,d1.w*2),(a3)
  2049. .holey:
  2050.  adda.w d0,a3
  2051.  add.l d3,d4
  2052.  addx.w d2,d4
  2053.  dbra d6,drawwalldimthruPACK0
  2054. nostripthru:
  2055.  rts
  2056.  
  2057.  CNOP 0,4
  2058. drawwalldimthruPACK1:
  2059.  and.w d7,d4
  2060.  move.w (a5,d4.w*2),d1
  2061.  lsr.w #5,d1
  2062.  and.w #31,d1
  2063.  beq.s .holey
  2064.  move.w (a4,d1.w*2),(a3)
  2065. .holey:
  2066.  adda.w d0,a3
  2067.  add.l d3,d4
  2068.  addx.w d2,d4
  2069.  dbra d6,drawwallthruPACK1
  2070.  rts
  2071.  CNOP 0,4
  2072. drawwallthruPACK1:
  2073.  and.w d7,d4
  2074.  move.w (a5,d4.w*2),d1
  2075.  lsr.w #5,d1
  2076.  and.w #31,d1
  2077.  beq.s .holey
  2078.  move.w (a2,d1.w*2),(a3)
  2079. .holey:
  2080.  adda.w d0,a3
  2081.  add.l d3,d4
  2082.  addx.w d2,d4
  2083.  dbra d6,drawwalldimthruPACK1
  2084.  rts
  2085.  
  2086.  CNOP 0,4
  2087. drawwalldimthruPACK2:
  2088.  and.w d7,d4
  2089.  move.b (a5,d4.w*2),d1
  2090.  lsr.b #2,d1
  2091.  and.b #31,d1
  2092.  beq.s .holey
  2093.  move.w (a4,d1.w*2),(a3)
  2094. .holey:
  2095.  adda.w d0,a3
  2096.  add.l d3,d4
  2097.  addx.w d2,d4
  2098.  dbra d6,drawwallthruPACK2
  2099.  rts
  2100.  CNOP 0,4
  2101. drawwallthruPACK2:
  2102.  and.w d7,d4
  2103.  move.b (a5,d4.w*2),d1
  2104.  lsr.b #2,d1
  2105.  and.b #31,d1
  2106.  beq.s .holey
  2107.  move.w (a2,d1.w*2),(a3)
  2108. .holey:
  2109.  adda.w d0,a3
  2110.  add.l d3,d4
  2111.  addx.w d2,d4
  2112.  dbra d6,drawwalldimthruPACK2
  2113.  rts
  2114.  
  2115.  
  2116. usesimplethru:
  2117.  mulu d3,d4
  2118.  
  2119.  add.l d0,d4
  2120.  swap d4
  2121.  add.w totalyoff(pc),d4
  2122.  
  2123. cliptopusesimplethru
  2124.  moveq #63,d7
  2125.  move.w #104*4,d0
  2126.  moveq #0,d1
  2127.  cmp.l a4,a2
  2128.  blt.s usea2thru
  2129.  move.l a4,a2
  2130. usea2thru:
  2131.  and.w d7,d4
  2132.  
  2133.  move.l d2,d5
  2134.  clr.w d5
  2135.  
  2136.  cmp.b #1,StripData+1
  2137.  dbge d6,simplewallthruiPACK0
  2138.  dbne d6,simplewallthruiPACK1
  2139.  dble d6,simplewallthruiPACK2
  2140.  rts
  2141.  
  2142.  CNOP 0,4
  2143. simplewallthruiPACK0:
  2144.  move.b 1(a5,d4.w*2),d1
  2145.  and.b #31,d1
  2146.  move.w (a2,d1.w*2),d3
  2147. simplewallthruPACK0:
  2148.  move.w d3,(a3)
  2149.  adda.w d0,a3
  2150.  add.l d5,d4
  2151.  bcc.s noreadthruPACK0
  2152. maybeholePACK0
  2153.  addx.w d2,d4
  2154.  and.w d7,d4
  2155.  move.b 1(a5,d4.w*2),d1
  2156.  and.b #31,d1
  2157.  beq.s holeysimplePACK0
  2158.  move.w (a2,d1.w*2),d3
  2159.  dbra d6,simplewallthruPACK0
  2160.  rts
  2161. noreadthruPACK0:
  2162.  addx.w d2,d4
  2163.  dbra d6,simplewallthruPACK0
  2164.  rts
  2165.  
  2166.  CNOP 0,4
  2167. simplewallholePACK0:
  2168.  adda.w d0,a3
  2169.  add.l d5,d4
  2170.  bcs.s maybeholePACK0
  2171.  addx.w d2,d4
  2172. holeysimplePACK0
  2173.  and.w d7,d4
  2174.  dbra d6,simplewallholePACK0
  2175.  rts
  2176.  
  2177.  CNOP 0,4
  2178. simplewallthruiPACK1:
  2179.  move.w (a5,d4.w*2),d1
  2180.  lsr.w #5,d1
  2181.  and.w #31,d1
  2182.  move.w (a2,d1.w*2),d3
  2183.  simplewallthruPACK1:
  2184.  move.w d3,(a3)
  2185.  adda.w d0,a3
  2186.  add.l d5,d4
  2187.  bcc.s noreadthruPACK1
  2188. maybeholePACK1
  2189.  addx.w d2,d4
  2190.  and.w d7,d4
  2191.  move.w (a5,d4.w*2),d1
  2192.  lsr.w #5,d1
  2193.  and.w #31,d1
  2194.  beq.s holeysimplePACK1
  2195.  move.w (a2,d1.w*2),d3
  2196.  dbra d6,simplewallthruPACK1
  2197.  rts
  2198. noreadthruPACK1:
  2199.  addx.w d2,d4
  2200.  dbra d6,simplewallthruPACK1
  2201.  rts
  2202.  
  2203.  CNOP 0,4
  2204. simplewallholePACK1:
  2205.  adda.w d0,a3
  2206.  add.l d5,d4
  2207.  bcs.s maybeholePACK1
  2208.  addx.w d5,d4
  2209. holeysimplePACK1
  2210.  and.w d7,d4
  2211.  dbra d6,simplewallholePACK1
  2212.  rts
  2213.  
  2214.  
  2215.  CNOP 0,4
  2216. simplewallthruiPACK2:
  2217.  move.b (a5,d4.w*2),d1
  2218.  lsr.b #2,d1
  2219.  and.b #31,d1
  2220.  move.w (a2,d1.w*2),d3
  2221. simplewallthruPACK2:
  2222.  move.w d3,(a3)
  2223.  adda.w d0,a3
  2224.  add.l d5,d4
  2225.  bcc.s noreadthruPACK2
  2226. maybeholePACK2
  2227.  addx.w d2,d4
  2228.  and.w d7,d4
  2229.  move.b (a5,d4.w*2),d1
  2230.  lsr.b #2,d1
  2231.  and.b #31,d1
  2232.  beq.s holeysimplePACK2
  2233.  move.w (a2,d1.w*2),d3
  2234.  dbra d6,simplewallthruPACK2
  2235.  rts
  2236. noreadthruPACK2:
  2237.  addx.w d2,d4
  2238.  dbra d6,simplewallthruPACK2
  2239.  rts
  2240.  
  2241.  CNOP 0,4
  2242. simplewallholePACK2
  2243.  adda.w d0,a3
  2244.  add.l d5,d4
  2245.  bcs.s maybeholePACK2
  2246.  addx.w d2,d4
  2247. holeysimplePACK2
  2248.  and.w d7,d4
  2249.  dbra d6,simplewallholePACK2
  2250.  rts
  2251.  
  2252.  
  2253. gotoendthru:
  2254.  add.l timeslargethru(pc,d5.w*4),a3 
  2255.  move.w d5,d4
  2256.  move.l 4(a1,d2.w*8),d0
  2257.  move.l (a1,d2.w*8),d2
  2258.  moveq #0,d3
  2259.  move.w d2,d3
  2260.  swap d2
  2261.  tst.w d2
  2262.  bne.s .notsimple
  2263.  cmp.l #$b000,d3
  2264.  ble usesimplethru
  2265. .notsimple:
  2266.  
  2267.  mulu d3,d4
  2268.  muls d2,d5
  2269.  add.l d0,d4
  2270.  swap d4
  2271.  add.w d5,d4
  2272.  add.w wallyoff(pc),d4
  2273. cliptopthru
  2274.  moveq #63,d7
  2275.  move.w #104*4,d0
  2276.  moveq #0,d1
  2277.  
  2278.  move.l d2,d3
  2279.  clr.w d3
  2280.  
  2281.  cmp.b #1,StripData+1
  2282.  dbge d6,drawwallthruPACK0
  2283.  dbne d6,drawwallthruPACK1
  2284.  dble d6,drawwallthruPACK2
  2285.  
  2286.  rts
  2287.  
  2288. timeslargethru:
  2289.  
  2290. val SET 104*4
  2291.  REPT 80
  2292.  dc.l val
  2293. val SET val+104*4
  2294.  ENDR
  2295.  
  2296. totalyoff: dc.w 0
  2297. wallyoff: dc.w 0
  2298.  
  2299. ******************************************
  2300. * Wall polygon
  2301. leftend: dc.w 0
  2302. wallbrightoff: dc.w 0
  2303. wallleftpt: dc.w 0
  2304. wallrightpt: dc.w 0
  2305. WHICHPBR: dc.w 0
  2306. WHICHLEFTPT: dc.w 0
  2307. WHICHRIGHTPT: dc.w 0
  2308. OTHERZONE: dc.w 0
  2309.  
  2310. itsawalldraw:
  2311.  
  2312.  move.l #Rotated,a5
  2313.  move.l #OnScreen,a6
  2314.  
  2315.  move.w (a0)+,d0
  2316.  move.w (a0)+,d2
  2317.  
  2318.  move.w d0,wallleftpt
  2319.  move.w d2,wallrightpt
  2320.  
  2321.  move.b (a0)+,WHICHLEFTPT+1
  2322.  move.b (a0)+,WHICHRIGHTPT+1
  2323.  move.w #0,leftend
  2324.  moveq #0,d5
  2325.  move.w (a0)+,d5
  2326.  
  2327.  ifne CHEESEY
  2328.  asr.w #1,d5
  2329.  endc
  2330.  
  2331.  move.w (a0)+,d1
  2332.  
  2333.  ifeq CHEESEY
  2334.  asl.w #4,d1
  2335.  endc
  2336.  ifne CHEESEY
  2337.  asl.w #3,d1
  2338.  endc
  2339.  
  2340.  move.w d1,fromtile
  2341.  
  2342.  move.w (a0)+,d1
  2343.  move.w d1,totalyoff
  2344.  
  2345.  move.w (a0)+,d1
  2346.  move.l #walltiles,a3
  2347.  move.l (a3,d1.w*4),a3
  2348.  move.l a3,PaletteAddr
  2349.  add.l #64*32,a3
  2350.  move.l a3,ChunkAddr
  2351.  
  2352.  ;move.w (a0)+,d1
  2353.  ;add.w ZoneBright,d1
  2354.  move.w ZoneBright,angbright
  2355.  ;move.w (a0)+,d1
  2356.  ;move.w (a0)+,d4
  2357.  move.l yoff,d6
  2358.  
  2359.  moveq #0,d1
  2360.  move.b (a0)+,d1
  2361.  
  2362.  ifne CHEESEY
  2363.  asr.w #1,d1
  2364.  endc
  2365.  move.w d1,VALAND
  2366.  
  2367.  moveq #0,d1
  2368.  move.b (a0)+,d1
  2369.  
  2370.  ifne CHEESEY
  2371.  sub.w #1,d1
  2372.  endc
  2373.  move.w d1,VALSHIFT
  2374.  
  2375.  moveq #0,d1
  2376.  move.b (a0)+,d1
  2377.  
  2378.  ifne CHEESEY
  2379.  asr.w #1,d1
  2380.  endc
  2381.  
  2382.  move.w d1,HORAND
  2383.  
  2384.  move.b (a0)+,WHICHPBR
  2385.  
  2386.  move.w totalyoff,d1
  2387.  add.w wallyoff,d1
  2388.  
  2389.  ifne CHEESEY
  2390.  asr.w #1,d1
  2391.  endc
  2392.  
  2393.  and.w VALAND,d1
  2394.  move.w d1,totalyoff
  2395.  
  2396.  move.l (a0)+,topofwall
  2397.  sub.l d6,topofwall
  2398.  move.l (a0)+,botofwall
  2399.  sub.l d6,botofwall
  2400.  
  2401.  
  2402.  move.b (a0)+,d3
  2403.  ext.w d3
  2404.  move.w d3,wallbrightoff
  2405.  move.b (a0)+,OTHERZONE+1
  2406.  
  2407.  move.l topofwall,d3
  2408.  cmp.l botofwall,d3
  2409.  bge wallfacingaway
  2410.  
  2411.  
  2412.  tst.w 6(a5,d0*8)
  2413.  bgt.s cantell
  2414.  tst.w 6(a5,d2*8)
  2415.  ble wallfacingaway
  2416.  bra cliptotestfirstbehind
  2417. cantell:
  2418.  tst.w 6(a5,d2*8)
  2419.  ble.s cliptotestsecbehind
  2420.  bra pastclip
  2421. cliptotestfirstbehind:
  2422.  
  2423.  move.l (a5,d0*8),d3
  2424.  sub.l (a5,d2*8),d3
  2425.  move.w 6(a5,d0*8),d6
  2426.  sub.w 6(a5,d2*8),d6
  2427.  divs d6,d3
  2428.  muls 6(a5,d2*8),d3
  2429.  neg.l d3
  2430.  add.l (a5,d2*8),d3
  2431.  move.w (a6,d2*2),d6
  2432.  sub.w MIDDLEX,d6
  2433.  ext.l d6
  2434.  cmp.l d6,d3
  2435.  bge wallfacingaway
  2436.  bra cant_tell
  2437.  bra pastclip
  2438.  
  2439. cliptotestsecbehind:
  2440.  
  2441.  move.l (a5,d2*8),d3
  2442.  sub.l (a5,d0*8),d3
  2443.  move.w 6(a5,d2*8),d6
  2444.  sub.w 6(a5,d0*8),d6
  2445.  divs d6,d3
  2446.  muls 6(a5,d0*8),d3
  2447.  neg.l d3
  2448.  add.l (a5,d0*8),d3
  2449.  move.w (a6,d0*2),d6
  2450.  sub.w MIDDLEX,d6
  2451.  ext.l d6
  2452.  cmp.l d6,d3
  2453.  ble wallfacingaway
  2454.  bra cant_tell
  2455.  
  2456. pastclip:
  2457.  
  2458.  move.w (a6,d0*2),d3
  2459.  cmp.w RIGHTX,d3
  2460.  bge wallfacingaway
  2461.  cmp.w (a6,d2*2),d3
  2462.  bge wallfacingaway
  2463.  tst.w (a6,d2*2)
  2464.  blt wallfacingaway
  2465.  
  2466. cant_tell:
  2467.  
  2468. ; move.l a1,a4
  2469. ; move.w #31,d6
  2470. ; move.l #0,d3
  2471. ;.emptylop:
  2472. ; move.l d3,(a4)+
  2473. ; dbra d6,.emptylop
  2474.  
  2475. ; move.w rightclip(pc),d6
  2476. ; st (a1,d6)
  2477. ; move.w leftclip(pc),d6
  2478. ; st -1(a1,d6)
  2479.  
  2480. ; muls sinval(pc),d1
  2481. ; muls cosval(pc),d4
  2482. ; add.l d1,d4
  2483. ; add.l d4,d4
  2484. ; swap d4
  2485. ; neg.w d4
  2486. ; move.w d4,d6
  2487. ; asr.w #1,d4
  2488. ; sub.w d4,angbright
  2489. ; and.b #$fe,d4
  2490. ; asl.w #2,d4
  2491. ; asl.w #2,d6
  2492.  
  2493.  movem.l d7/a0/a5/a6,-(a7)
  2494.  move.l (a5,d0*8),a0
  2495. ; add.l a0,a0
  2496.  move.w 6(a5,d0*8),d1
  2497.  move.l (a5,d2*8),a2
  2498. ; add.l a2,a2
  2499.  move.w 6(a5,d2*8),d3
  2500.  
  2501.  move.l #CurrentPointBrights,a5
  2502.  tst.b DOUPPER
  2503.  beq.s .notupper
  2504.  add.w #4,a5
  2505. .notupper
  2506.  
  2507.  move.w currzone,d0
  2508.  move.b WHICHPBR,d4
  2509.  btst #3,d4
  2510.  beq.s .nototherzone 
  2511.  move.w OTHERZONE,d0
  2512. .nototherzone
  2513.  
  2514.  and.w #7,d4
  2515.  muls #40,d0
  2516.  add.w d0,d4
  2517.  
  2518.  move.w WHICHLEFTPT,d0
  2519.  asl.w #2,d0
  2520.  add.w d4,d0
  2521.  
  2522.  move.w (a5,d0.w*2),d0
  2523.  bge.s .okpos1
  2524.  neg.w d0
  2525. .okpos1:
  2526.  
  2527.  add.w wallbrightoff,d0
  2528.  move.w d0,leftwallbright
  2529.  
  2530.  move.w WHICHRIGHTPT,d0
  2531.  asl.w #2,d0
  2532.  add.w d4,d0
  2533.  move.w (a5,d0.w*2),d0
  2534.  bge.s .okpos2
  2535.  neg.w d0
  2536. .okpos2:
  2537.  
  2538.  add.w wallbrightoff,d0
  2539.  move.w d0,rightwallbright
  2540.  
  2541.  move.w currzone,d0
  2542.  move.b WHICHPBR,d4
  2543.  lsr.w #4,d4
  2544.  btst #3,d4
  2545.  beq.s .nototherzone2 
  2546.  move.w OTHERZONE,d0
  2547. .nototherzone2
  2548.  
  2549.  and.w #7,d4
  2550.  muls #40,d0
  2551.  add.w d0,d4
  2552.  
  2553.  move.w WHICHLEFTPT,d0
  2554.  asl.w #2,d0
  2555.  add.w d4,d0
  2556.  
  2557.  move.w (a5,d0.w*2),d0
  2558.  bge.s .okpos3
  2559.  neg.w d0
  2560. .okpos3:
  2561.  
  2562.  
  2563.  add.w wallbrightoff,d0
  2564.  move.w d0,leftwallTOPbright
  2565.  
  2566.  move.w WHICHRIGHTPT,d0
  2567.  asl.w #2,d0
  2568.  add.w d4,d0
  2569.  move.w (a5,d0.w*2),d0
  2570.  bge.s .okpos4
  2571.  neg.w d0
  2572. .okpos4:
  2573.  add.w wallbrightoff,d0
  2574.  move.w d0,rightwallTOPbright
  2575.  
  2576.  move.w leftend(pc),d4
  2577.  move.l #max3ddiv,d7
  2578.  
  2579.  ifeq CHEESEY
  2580.  
  2581.  move.w rightwallTOPbright,d0
  2582.  cmp.w rightwallbright,d0
  2583.  bne.s gottagour
  2584.  move.w leftwallTOPbright,d0
  2585.  cmp.w leftwallbright,d0
  2586.  bne.s gottagour
  2587.  
  2588.  endc
  2589.  
  2590.  bsr walldraw
  2591.  bra.s nottagour
  2592.  
  2593. gottagour:
  2594.  bsr walldrawGOUR
  2595. nottagour:
  2596.  movem.l (a7)+,d7/a0/a5/a6
  2597.  
  2598. wallfacingaway:
  2599.  
  2600.  rts
  2601.  
  2602. PointBrightsPtr: dc.l 0
  2603. midpt: dc.l 0
  2604. dist1: dc.l 0
  2605. dist2: dc.l 0
  2606. VALAND: dc.w 0
  2607. VALSHIFT: dc.w 0
  2608. HORAND: dc.w 0
  2609.  
  2610. sinval: dc.w 0
  2611. cosval: dc.w 0
  2612.  
  2613. oldxoff: dc.w 0
  2614. oldzoff: dc.w 0
  2615.  
  2616. topclip: dc.w 0
  2617. botclip: dc.w 0
  2618. seethru: dc.w 0
  2619.